package br.com.ss.util;

import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.ss.enumeration.EMensageError;
import br.com.ss.enumeration.EMensageSucess;
import br.com.ss.enumeration.EMensageWarning;
import br.com.ss.enumeration.ETipoMensagem;
import br.com.ss.exception.BaseException;

public class FacesUtil {

	public static String getRequestParameter(String name) {
		return (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(name);
	}

	/* --------------------- Mensagem Sucesso -------------------------------------- */

	public static FacesMessage criarMensagemSucesso(EMensageSucess mensagem, Object[] params, boolean keepAlive, boolean setMensagemNoContexto) {
		return criarMensagem(FacesMessage.SEVERITY_INFO, ETipoMensagem.SUCESSO.getValue() + " (" + mensagem.getCodigo() + ")", mensagem.getValue(params), keepAlive, setMensagemNoContexto);
	}

	public static FacesMessage criarMensagemSucesso(EMensageSucess mensagem, Object[] params) {
		return criarMensagemSucesso(mensagem, params, true, true);
	}

	public static FacesMessage criarMensagemSucesso(EMensageSucess mensagem) {
		return criarMensagemSucesso(mensagem, null);
	}

	public static FacesMessage criarMensagemSucesso(Exception exception) {
		
		return criarMensagemSucesso(exception, true);
	}

	public static FacesMessage criarMensagemSucesso(Exception exception, boolean setMensagemNoContexto) {
		
		String severity = "";
		
		if(exception instanceof BaseException){
			severity = ETipoMensagem.SUCESSO.getValue() + " (" + ((BaseException)exception).getCodigo() + ")"; 
		} else {
			severity = ETipoMensagem.SUCESSO.getValue();
		}
		
		return criarMensagem(FacesMessage.SEVERITY_INFO, severity, exception.getMessage(), true, setMensagemNoContexto);
	}

	/* --------------------- Mensagem Alerta -------------------------------------- */

	public static FacesMessage criarMensagemAlerta(EMensageWarning mensagem, Object[] params, boolean keepAlive, boolean setMensagemNoContexto) {
		return criarMensagem(FacesMessage.SEVERITY_WARN, ETipoMensagem.ALERTA.getValue() + " (" + mensagem.getCodigo() + ")", mensagem.getValue(params), keepAlive, setMensagemNoContexto);
	}

	public static FacesMessage criarMensagemAlerta(EMensageWarning mensagem, Object[] params) {
		return criarMensagemAlerta(mensagem, params, true, true);
	}

	public static FacesMessage criarMensagemAlerta(EMensageWarning mensagem) {
		return criarMensagemAlerta(mensagem, null);
	}

	public static FacesMessage criarMensagemAlerta(Exception err) {
		return criarMensagemAlerta(err, true);
	}

	public static FacesMessage criarMensagemAlerta(Exception err, boolean setMensagemNoContexto) {
		
		String severity = "";
		
		if(err instanceof BaseException){
			severity = ETipoMensagem.ALERTA.getValue() + " (" + ((BaseException)err).getCodigo() + ")"; 
		} else {
			severity = ETipoMensagem.ALERTA.getValue();
		}
		
		return criarMensagem(FacesMessage.SEVERITY_WARN, severity, err.getMessage(), true, setMensagemNoContexto);
	}

	/* --------------------- Mensagem Erro -------------------------------------- */
	public static FacesMessage criarMensagemErro(EMensageError mensagem, Object[] params, boolean keepAlive, boolean setMensagemNoContexto) {

		FacesMessage fmRetorno = null;

		try {
			if (mensagem == null) 
				throw new Exception(EMensageError.PARAMETRO_NULO_.getValue(new Object[] { "EMensageError mensagem" }));
			
			fmRetorno = criarMensagem(FacesMessage.SEVERITY_ERROR, ETipoMensagem.ERRO.getValue() + " (" + mensagem.getCodigo() + ")", mensagem.getValue(params), keepAlive, setMensagemNoContexto);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return fmRetorno;
	}

	public static FacesMessage criarMensagemErro(EMensageError mensagem, Object[] params) {
		return criarMensagemErro(mensagem, params, true, true);
	}

	public static FacesMessage criarMensagemErro(EMensageError mensagem) {
		return criarMensagemErro(mensagem, null);
	}

	public static FacesMessage criarMensagemErro(Exception err) {
		return criarMensagemErro(err, true);
	}

	public static FacesMessage criarMensagemErro(Exception err, boolean setMensagemNoContexto) {
		
		String severity = "";
		
		if(err instanceof BaseException){
			severity = ETipoMensagem.ERRO.getValue() + " (" + ((BaseException)err).getCodigo() + ")"; 
		} else {
			severity = ETipoMensagem.ERRO.getValue();
		}
		
		return criarMensagem(FacesMessage.SEVERITY_ERROR, severity, err.getMessage(), true, setMensagemNoContexto);
	}

	/* --------------------- Mensagem Fatal -------------------------------------- */
	public static FacesMessage criarMensagemFatal(EMensageError mensagem, Object[] params, boolean keepAlive, boolean setMensagemNoContexto) {

		FacesMessage fmRetorno = null;

		try {
			if (mensagem == null)
				throw new Exception(EMensageError.PARAMETRO_NULO_.getValue(new Object[] { "EMensageError mensagem" }));

			fmRetorno = criarMensagem(FacesMessage.SEVERITY_FATAL, ETipoMensagem.ERRO_FATAL.getValue() + " (" + mensagem.getCodigo() + ")", mensagem.getValue(params), keepAlive, setMensagemNoContexto);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return fmRetorno;

	}

	public static FacesMessage criarMensagemFatal(EMensageError mensagem, Object[] params, boolean setMensagemNoContexto) {
		return criarMensagemFatal(mensagem, params, true, true);
	}

	public static FacesMessage criarMensagemFatal(EMensageError mensagem, Object[] params) {
		return criarMensagemFatal(mensagem, params, true);
	}

	public static FacesMessage criarMensagemFatal(EMensageError mensagem) {
		return criarMensagemFatal(mensagem, null);
	}

	public static FacesMessage criarMensagemFatal(Exception err) {
		return criarMensagemFatal(err, true);
	}

	public static FacesMessage criarMensagemFatal(Exception err, boolean setMensagemNoContexto) {
		
		String severity = "";
		
		if(err instanceof BaseException){
			severity = ETipoMensagem.ERRO.getValue() + " (" + ((BaseException)err).getCodigo() + ")"; 
		} else {
			severity = ETipoMensagem.ERRO.getValue();
		}
		
		return criarMensagem(FacesMessage.SEVERITY_FATAL, severity, err.getMessage(), true, setMensagemNoContexto);
	}

	/* -=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-= */

	private static FacesMessage criarMensagem(FacesMessage.Severity severity, String summary, String mensagem, boolean keepAlive, boolean setMensagemNoContexto) {

		if (null == summary) {
			summary = "";
		}

		if (keepAlive) {
			FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
		}

		FacesMessage facesMessage = new FacesMessage(severity, summary, mensagem);

		if (setMensagemNoContexto) {
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		}

		return facesMessage;
	}

	public static ExternalContext getExternalContext() {
		return FacesContext.getCurrentInstance().getExternalContext();
	}

	@SuppressWarnings("rawtypes")
	public static Map getSessionMap() {
		return FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
	}

	public static HttpSession getSession() {
		return (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
	}

	public static ServletContext getServletContext() {
		return (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
	}

	public static FacesContext getCurrentInstance() {
		return (FacesContext) FacesContext.getCurrentInstance();
	}

	public static HttpServletRequest getServletRequest() {
		return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
	}

	public static HttpServletResponse getServletResponse() {
		return (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
	}

	/**
	 * M�todo que retorna um objeto Flash para permitir que sejam armazenados valores entre diversas p�ginas.
	 * 
	 * @return
	 */
	public static Flash getFlash() {
		return FacesContext.getCurrentInstance().getExternalContext().getFlash();
	}

	/**
	 * M�todo que recupera um objeto
	 * 
	 * @param chave
	 *            representa a chave utilizada para armazenar o objeto no Flash.
	 * @param classeDoObjeto
	 *            representa a classe do objeto que se deseja recuperar. � utilizada para comparar a classe do objeto recuperado pela chave, caso seja diferente retorna null e remove o valor da tabela.
	 * @return o objeto armazenado anteriormente pela chave.
	 */
	public static Object flashGet(String chave, Class<?> classeDoObjeto) {
		Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

		Object valor = flash.get(chave);
		if (valor == null)
			return null;

		// testa se a classe do objeto encontrado � diferente da classe desejada
		if (classeDoObjeto != null) {
			if (valor.getClass() != classeDoObjeto) {
				// se for diferente, deve remover o objeto antigo e retornar null
				flash.remove(chave);
				return null;
			}
		}

		return valor;
	}

	public static HttpSession getHttpSession() {
		return (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
	}

	@SuppressWarnings("unchecked")
	public static <T> T getSessionBean(String beanName, Class<T> beanClass) {

		Object obj = getHttpSession().getAttribute(beanName);

		return (T) obj;
	}

	public static String getClientIP() {
		return getServletRequest().getRemoteAddr();
	}
	
	
	public static boolean isMobile() {
		String ua = getServletRequest().getHeader("User-Agent").toLowerCase();
		
		return (ua.matches("(?i).*((android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino).*")||ua.substring(0,4).matches("(?i)1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-"));		
	}
	

}